package es.duma.service.picasa;

import es.duma.search.SearchRESTService;
import es.duma.util.log.Log;
import es.duma.util.xmlparse.search.DumaSearch;

import java.net.URLEncoder;

import java.util.Iterator;

/**
 * Implementacion del modulo de acceso al repositorio PicasaWeb.
 * Implementa la clase SearchRESTService
 */
public class SearchRESTpicasa  implements SearchRESTService{ 
    
    /**
     * Path absoluto de la plantilla xsl de transformacion de los foramtos de metainformacion
     */
    private String xslPath;    
    //Configuracion de la ruta del xsl
    protected static final String YOUTUBE_XSL="PICASA_XSL";
    
    /**
     * Url base para las peticiones REST sobre le API de picasa
     */
    protected static final String BASE="http://picasaweb.google.com/data/feed/api/all?kind=photo";
    
    /**
     * Url base para las peticiones que incluyen busqueda por autor
     */
    protected static final String BASE_AUTHOR="http://picasaweb.google.com/data/feed/api/user/";
    
    /**
     * Idioma por defecto en las busquedas
     */
    protected static final String DEFAULT_LANGUAGE="es";
    
    /**
     * Maximo numero de resultados permitos por defecto
     */
    protected static final int DEFAULT_MAX_RESULTS=30;
    
    /**
     * Maximo numero de resultados fijado por las restricciones del API
     */
    protected static final int MAX_RESULTS=100;
    
    
    protected int maxResults=DEFAULT_MAX_RESULTS;
    
    
     /**
      * Genera la url de peticion de busqueda a partir de la busqueda pasada por parametro
      * @param dumaSearch Objeto con el xml de busqueda encapsulado
      * Se accede a los elementos y atributos del xml de busqueda como un bean
      * @return
      */
    public String getREST_URL(DumaSearch dumaSearch) {
        
        if (dumaSearch==null)
            return BASE;
        
        // Cadena con la url completa de busqueda.
        String url="";
        
        // Cadena con las palabras clave y no permitidas obtenidas del xml de busuqeda
        String query="";
        
        //Palabras clave de busqueda
        Log.debug(this,"Se fijan las palabras clave");
        Iterator keys;
        keys = (dumaSearch.getSearch().getKey()).iterator();
        String key="";
        while (keys.hasNext()){
             key=URLEncoder.encode((String)keys.next());
             query+=key;
             if (keys.hasNext())
                 query+="+";
         }
        
                 
        // Palabras prohibidas en la busqueda
        Log.debug(this,"Se fijan las palabras prohibidas en la busqueda");
        Iterator notkeys;
        notkeys=(dumaSearch.getSearch().getNotkey()).iterator();
        while (notkeys.hasNext()){
            query+="+-"+(String)notkeys.next();
        }
        
        Log.debug(this,"Cadena de busqueda generada: "+query);
        
        
        url=BASE+"&q="+query;
        
        //Se añaden las restricciones de la busqueda
        //Idioma a la URL de busqueda
         url+="&l="+DEFAULT_LANGUAGE;
         
        // Resultado maximo
         url+="&max-results="+maxResults;
         
         
        // Tratamiento del nodo author si lo hubiera
        // La busuqeda por author es una url diferente.
        String authorId=dumaSearch.getAuthor().getUserId();
        if (authorId!=null){
            Log.debug(this,"Se fija la busqueda por autor");        
            url= BASE_AUTHOR+authorId+"?kind=photo";
            if (!query.equalsIgnoreCase(""))
                url+="&tag="+query;
        }
        
        Log.debug(this,"Direcccion final de busqueda REST para picasaweb: "+url);
        return url; 
    }

    /**
     *Se fija el numero maximo deseado de resultados en la busqueda
     * @param i maximo numero de resultados para la busqueda
     */
    public void setMaxResults(int i) {
        if (i<=MAX_RESULTS)
            this.maxResults=i;
        else
            this.maxResults=MAX_RESULTS;
    }

    /**
     * Se fija la plantilla xsl de transforamcion del formato de metainformacion fijado por Google al
     * formato Universal manejado por el sistema DUMA
     * @param string path absoluto de la plantilla xsl
     */
    public void setXslPath(String string) {
        this.xslPath=xslPath;
    }
    
    
    /**
     * Se obtiene el path de la plantilla xsl
     * @return path absoluto de la plantilla xsl de transformacion de la metainformacion
     */
    public String getXslPath() {
        return xslPath;
    }
}
